// src/permissions/entities/permission.entity.ts
import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  ManyToMany,
  ManyToOne,
  OneToMany,
} from 'typeorm';
import { Role } from '../../role/entities/role.entity';
import { v4 as uuidv4 } from 'uuid';

@Entity('permission')
export class Permission {
  @PrimaryGeneratedColumn('uuid')
  id: string = uuidv4();

  /**
   * 权限标识符，用于唯一标识该权限，如 "system:user:create", "system:role:edit"
   * 用于在代码中进行权限校验
   */
  @Column({ length: 100, unique: true })
  permission_key: string;

  /**
   * 权限名称（例如：'用户管理'、'角色编辑'）
   */
  @Column({ length: 100, unique: true })
  permission_name: string;

  /**
   * 权限描述，帮助理解该权限的功能
   * 例如：'创建用户'、'编辑角色'
   */
  @Column({ type: 'text', nullable: true })
  description: string;

  /**
   * 权限的创建时间，系统自动生成
   */
  @CreateDateColumn()
  created_at: Date;

  /**
   * 权限的最后更新时间，系统自动更新
   */
  @UpdateDateColumn()
  updated_at: Date;

  /**
   * 权限的创建者，记录创建该权限的用户
   * 可存储用户ID或用户名（建议存储用户ID）
   */
  @Column({ length: 50, nullable: true })
  creator: string;

  /**
   * 权限的备注信息，帮助管理员更好地理解该权限的用途
   */
  @Column({ type: 'text', nullable: true })
  remarks: string;

  /**
   * 与角色的多对多关系，关联所有拥有该权限的角色
   */
  @ManyToMany(() => Role, (role) => role.permissions)
  roles: Role[];

  /**
   * 权限是否已删除（逻辑删除），默认为未删除
   * 0：未删除，1：已删除
   */
  @Column({ default: false })
  is_deleted: boolean;

  /**
   * 权限是否禁用，默认为禁用
   * 0：禁用，1：启用
   */
  @Column({ default: true })
  is_enabled: boolean;

  /**
   * 权限是否是系统默认权限，默认是 false
   * 例如：系统预设的基础权限不允许删除
   */
  @Column({ default: false })
  is_default: boolean;

  /**
   * 权限的级别，数值越大，权限级别越高
   * 例如：'ADMIN' 权限的级别可能比普通用户的级别要高
   */
  @Column({ type: 'int', default: 1 })
  level: number;

  /**
   * 父权限，用于支持权限层级结构
   * 例如：'用户管理'权限下有多个子权限：'创建用户'、'删除用户'等
   */
  @ManyToOne(() => Permission, (permission) => permission.children, {
    nullable: true,
  })
  parent: Permission;

  /**
   * 子权限列表，用于定义权限层级
   */
  @OneToMany(() => Permission, (permission) => permission.parent, {
    nullable: true,
  })
  children: Permission[];
}
